from keras.models import Sequential
from keras.layers.core import Activation, Dropout, Dense
from keras.layers.normalization import BatchNormalization
from keras import backend as K

class FCNetA:
    @staticmethod
    def build(dim):
        model = Sequential()
        model.add(Dense(128, input_shape=(dim, )))
        model.add(Activation("relu"))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dense(1))
        model.add(Activation("sigmoid"))
        return model

class FCNetB:
    @staticmethod
    def build(dim):
        model = Sequential()
        model.add(Dense(128, input_shape=(dim, )))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(1))
        model.add(Activation("sigmoid"))
        return model

class FCNetC:
    @staticmethod
    def build(dim):
        model = Sequential()
        model.add(Dense(128, input_shape=(dim, )))
        model.add(Activation("relu"))
        model.add(Dropout(0.5))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.5))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.5))
        model.add(Dense(1))
        model.add(Activation("sigmoid"))
        return model

class FCNetD:
    @staticmethod
    def build(dim):
        model = Sequential()
        model.add(Dense(128, input_shape=(dim, )))
        model.add(BatchNormalization(epsilon=0.001, scale=False))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(1))
        model.add(Activation("sigmoid"))
        return model

class FCNetE:
    @staticmethod
    def build(dim):
        model = Sequential()
        model.add(Dense(128, input_shape=(dim, )))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(BatchNormalization(epsilon=0.001, scale=False))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(1))
        model.add(Activation("sigmoid"))
        return model

class FCNetF:
    @staticmethod
    def build(dim):
        model = Sequential()
        model.add(Dense(128, input_shape=(dim, )))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(BatchNormalization(epsilon=0.001, scale=False))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(1))
        model.add(Activation("sigmoid"))
        return model

class FCNetG:
    @staticmethod
    def build(dim):
        model = Sequential()
        model.add(Dense(128, input_shape=(dim, )))
        model.add(BatchNormalization(epsilon=0.001, scale=False))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(BatchNormalization(epsilon=0.001, scale=False))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(128))
        model.add(BatchNormalization(epsilon=0.001, scale=False))
        model.add(Activation("relu"))
        model.add(Dropout(0.25))
        model.add(Dense(1))
        model.add(Activation("sigmoid"))
        return model
